﻿using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using Microsoft.QualityTools.Testing.Fakes;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using User.Global.Contracts.Message;
using User.Web.UI.Helper.CastleWindsor.Fakes;
using User.Web.UI.Helper.Messages;

namespace User.Web.UI.Tests.Unit.CommonTests
{
    [TestClass]
    public class CustomMessageTest : CommonBaseTest
    {
        /// <summary>
        /// Prüfen ob Meldungen erfolgreich dem Dictionary hinzugefügt werden können
        /// </summary>
        [TestMethod]
        public void Add_Success()
        {
            using (ShimsContext.Create())
            {
                CustomMessage message = new CustomMessage();
                ShimCustomControllerFactory.GetCurrentController = () => AccountController;
                AccountController.TempData = new TempDataDictionary() { { CustomMessage.TempMessageString, new List<IMessage>() } };

                //Assert
                Assert.IsTrue(message.Add("Testmeldung", MessageTypes.message));
            }
        }

        /// <summary>
        /// Prüfen ob Meldungen erfolgreich dem Dictionary hinzugefügt werden können, wenn im Dict. noch keine Meldungen enthalten sind.
        /// </summary>
        [TestMethod]
        public void Add_Success_MessageIsNull()
        {
            using (ShimsContext.Create())
            {
                CustomMessage message = new CustomMessage();
                ShimCustomControllerFactory.GetCurrentController = () => AccountController;
                //Im Dict sind noch keine Meldungen enthalten
                AccountController.TempData = new TempDataDictionary() { { CustomMessage.TempMessageString, null } };

                //Assert
                Assert.IsTrue(message.Add("Testmeldung", MessageTypes.message));
            }
        }

        /// <summary>
        /// Prüfen ob auch neue Messages dem Dictionary hinzugefügt werden, denn sobald die Werte aus dem Dict
        /// abgerufen werden, werden diese aus dem Dict entfernt.
        /// </summary>
        [TestMethod]
        public void Add_CheckMessageCounter()
        {
            List<IMessage> oldMessages = new List<IMessage>();
            oldMessages.Add(new Message("TestMeldung 1", MessageTypes.ok));
            oldMessages.Add(new Message("TestMeldung 1.2", MessageTypes.ok));
            oldMessages.Add(new Message("TestMeldung 2", MessageTypes.error));

            using (ShimsContext.Create())
            {
                CustomMessage message = new CustomMessage();
                ShimCustomControllerFactory.GetCurrentController = () => AccountController;
                AccountController.TempData = new TempDataDictionary() { { CustomMessage.TempMessageString, oldMessages } };
                //Weitere Messages hinzufügen
                message.Add("Testmeldung 3", MessageTypes.message);
                message.Add("Testmeldung 4", MessageTypes.error);
                message.Add("Testmeldung 5", MessageTypes.warning);
                //Alle Messages abrufen auf dem Tempdata
                List<IMessage> newMessages = (List<IMessage>)AccountController.TempData[CustomMessage.TempMessageString];

                //Prüfen, ob die passenden Messagetypen auch in der Liste enthalten sind.
                Assert.AreEqual(6, newMessages.Count);
                Assert.AreEqual(2, newMessages.Count(p => p.MessageType == MessageTypes.error));
                Assert.AreEqual(1, newMessages.Count(p => p.MessageType == MessageTypes.warning));
                Assert.AreEqual(2, newMessages.Count(p => p.MessageType == MessageTypes.ok));
                Assert.AreEqual(1, newMessages.Count(p => p.MessageType == MessageTypes.message));
            }
        }

        /// <summary>
        /// Prüfen ob False zurück gegeben wird, wenn kein Controller gefunden werden konnte
        /// </summary>
        [TestMethod]
        public void Add_Failed_ControllerIsNull()
        {
            using (ShimsContext.Create())
            {
                CustomMessage message = new CustomMessage();
                ShimCustomControllerFactory.GetCurrentController = () => null;
                AccountController.TempData = new TempDataDictionary() { { CustomMessage.TempMessageString, new List<IMessage>() } };

                //Assert
                Assert.IsFalse(message.Add("Testmeldung", MessageTypes.message));
            }
        }

        /// <summary>
        /// Prüfen ob False zurück gegeben wird, wenn als TExtmeldung Null übergeben wurde
        /// </summary>
        [TestMethod]
        public void Add_Failed_TextIsNull()
        {
            CustomMessage message = new CustomMessage();
            //Assert
            Assert.IsFalse(message.Add(null, MessageTypes.message));
        }
    }
}
